package com.jdbc.durid;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.alibaba.druid.pool.DruidPooledConnection;
import org.junit.Test;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * Copyright (c) 2023-2033 All Rights Reserved
 *
 * JDBC Part3
 *
 * Druid 连接池使用
 * 1. 创建配置文件，```druid.properties```中定义 ```driverClassName、url、username、password```四个必须参数。
 * 2. 读取配置文件，通过 ```DruidUse.class.getClassLoader().getResourceAsStream(druid.properties)``` 实现。
 * 3. 加载配置文件，通过``` java.util.Properties#load(java.io.InputStream)``` 实现。
 * 4. 创建连接池 通过 ```com.alibaba.druid.pool.DruidDataSourceFactory#createDataSource(java.util.Properties)``` 实现。
 * 5. 获取连接，通用方法，所有三方连接池都一样，都实现了``` javax.sql.DataSource#getConnection()``` 方法。
 * 6. 回收连接，通用方法，所有三方连接池都一样，都实现了``` java.sql.Connection#close()``` 方法。
 *
 * TODO：
 *  JDBC 的数据库连接池使用 javax.sql.DataSource 接口进行规范,所有的第三方连接池都实现此接口，不同的只有性能和扩展功能
 *
 * @date: 2023/9/25
 */
public class DruidUse {
    /**
     * 硬编码方式，不推荐
     * 1. 创建druid连接池对象 DruidDataSource
     * 2. 设置连接池参数，必须参数： 驱动driverClass、账号、密码、url。非必须参数：初始化个数、最大数量等等  不推荐设置
     */
    @Test
    public void druidHard() throws SQLException {

        // 连接池对象
        DruidDataSource dataSource = new DruidDataSource();

        //设置四个必须参数
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///jdbc");
        dataSource.setUsername("root");
        dataSource.setPassword("root");

        //获取连接
        DruidPooledConnection connection = dataSource.getConnection();

        //回收连接
        connection.close();
    }

    /**
     * 软编码方式，推荐，通过读取外部配置文件初始化连接池
     * 1. 新建配置文件 druid.properties，以 key-value 形式保存参数，Java Properties 会读取配置文件中的参数
     * 2. 读取外部配置文件
     * 3. 使用连接池的工具类创建连接池
     */
    @Test
    public void druidSoft() throws Exception {
        // 1. 创建Properties用于加载配置文件
        Properties properties = new Properties();

        // 2. src下的文件可以使用类加载器提供的方法
        InputStream rs = DruidUse.class.getClassLoader().getResourceAsStream("druid.properties");
        properties.load(rs);

        // 3. 使用连接池的工具类创建连接池
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

        // 4. 从连接池获取连接
        Connection connection = dataSource.getConnection();

        // 5. 关闭连接
        connection.close();
    }
}
